package com.zf.yichat.service.impl;

import com.github.pagehelper.PageHelper;
import com.zf.yichat.dto.*;
import com.zf.yichat.mapper.MissionCodeMapper;
import com.zf.yichat.mapper.MissionComplainMapper;
import com.zf.yichat.mapper.MissionMapper;
import com.zf.yichat.mapper.UserMissionMapper;
import com.zf.yichat.model.*;
import com.zf.yichat.service.BalanceService;
import com.zf.yichat.service.MissionService;
import com.zf.yichat.service.SysDictService;
import com.zf.yichat.service.UserService;
import com.zf.yichat.utils.YiChatMsgCode;
import com.zf.yichat.utils.common.DateUtils;
import com.zf.yichat.utils.common.DtoChangeUtils;
import com.zf.yichat.utils.response.FsResponse;
import com.zf.yichat.utils.response.FsResponseGen;
import com.zf.yichat.vo.BalanceType;
import com.zf.yichat.vo.DictKey;
import com.zf.yichat.vo.MissionCheckStatus;
import com.zf.yichat.vo.MissionStatus;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.math.BigDecimal;
import java.util.*;

/**
 * 一句话描述功能
 *
 * @author fengsong
 * @date create in 10:49 2020/3/16 2020
 */
@Service
public class MissionServiceImpl implements MissionService {

//    @Autowired
//    private MissionMapper missionMapper;
//
//    @Autowired
//    private BalanceService balanceService;
//
//    @Autowired
//    private SysDictService sysDictService;
//
//    @Autowired
//    private UserMissionMapper userMissionMapper;
//
//    @Autowired
//    private MissionCodeMapper missionCodeMapper;
//
//    @Autowired
//    private UserService userService;
//
//    @Autowired
//    private MissionComplainMapper missionComplainMapper;
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public FsResponse save(Long missionId, String title, String memo, String mainPic, String imgs, Integer checkType, Integer num, BigDecimal price, Long userId) {
//
//        UserBalance userBalance = balanceService.selectByUserId(userId);
//
//        //计算总金额及佣金
//        BigDecimal total = price.multiply(new BigDecimal(num));
//        //配置的佣金
//        SysDict dict = sysDictService.selectOne(DictKey.mission_commission);
//        BigDecimal commission = Optional.ofNullable(dict).map(v -> new BigDecimal(v.getValue())).orElse(BigDecimal.ZERO);
//
//        //判断余额是否足够
//        if (userBalance.getIncomeBalance().compareTo(total.add(total.multiply(commission))) < 0) {
//            return FsResponseGen.fail(YiChatMsgCode.WITHDRAW_APPLY_BALANCE_LITTLE);
//        }
//
//        //插入任务数据
//        Mission mission = new Mission();
//        mission.setHasNum(num);
//        mission.setNum(num);
//        mission.setUserId(userId);
//        mission.setPrice(price);
//        mission.setTitle(title);
//        mission.setMainPic(mainPic);
//        mission.setStatus(MissionStatus.publich.getVal());
//        mission.setCompleteNum(0);
//        mission.setCtime(new Date());
//        mission.setCheckType(checkType);
//        mission.setCheckNum(0);
//        mission.setImgs(imgs);
//        mission.setCheckStatus(0);
//        mission.setMemo(memo);
//        if (Objects.nonNull(missionId)) {
//            mission.setId(missionId);
//            missionMapper.updateByPrimaryKeySelective(mission);
//        } else {
//            missionMapper.insertUseGeneratedKeys(mission);
//
//        }
//
//        //扣除余额和佣金
//        balanceService.update(userId, BalanceType.MISSION, total, mission.getId(), "发布任务");
//        balanceService.update(userId, BalanceType.MISSION_COMMISSION, commission, mission.getId(), "发布任务佣金");
//
//        return FsResponseGen.success();
//    }
//
//    @Override
//    public FsResponse selectMyList(Integer pageNo, Integer pageSize, Long userId) {
//        Example example = new Example(Mission.class);
//        example.createCriteria().andEqualTo("userId", userId);
//        example.setOrderByClause(" status asc ");
//        PageHelper.startPage(pageNo, pageSize);
//        return DtoChangeUtils.getPageList(missionMapper.selectByExample(example), v -> {
//
//
//            MissionMyListDto dto = new MissionMyListDto();
//
//            dto.setMainPic(v.getMainPic());
//            dto.setPrice(v.getPrice());
//            dto.setMissionId(v.getId());
//            dto.setStatus(v.getStatus());
//            dto.setNum(v.getNum());
//            dto.setCompleteNum(v.getCompleteNum());
//            dto.setCheckNum(v.getCheckNum());
//            dto.setReason(v.getRefuseReason());
//
//            //待审核
//            if (v.getCheckStatus() == 0) {
//                dto.setStatus(-1);
//                dto.setStatusDesc("待审核");
//                //审核通过
//            } else if (v.getCheckStatus() == 1) {
//                dto.setStatusDesc(MissionStatus.valOf(v.getStatus()).getDesc());
//            } else {//审核拒绝
//                dto.setStatusDesc("已拒绝");
//                dto.setStatus(3);
//            }
//
//            dto.setTimeDesc(DateUtils.formatDate(v.getPublishTime(), "yyyy-MM-dd HH:mm"));
//            dto.setTitle(v.getTitle());
//
//            return dto;
//        });
//    }
//
//    @Override
//    public FsResponse selectList(Integer pageNo, Integer pageSize, Long userId) {
////        Example example = new Example(Mission.class);
////        example.createCriteria().andEqualTo("checkStatus", 1).andEqualTo("status", 0);
////        example.setOrderByClause(" publish_time asc ");
//        PageHelper.startPage(pageNo, pageSize);
//        return DtoChangeUtils.getPageList(missionMapper.selectList(userId), v -> {
//
//            MissionListDto dto = new MissionListDto();
//
//            dto.setMainPic(v.getMainPic());
//            dto.setMissionId(v.getId());
//            dto.setCompleteNum(v.getCompleteNum());
//            dto.setNum(v.getNum());
//            dto.setPrice(v.getPrice());
//
//
//            dto.setTimeDesc(DateUtils.formatDate(v.getPublishTime(), "yyyy-MM-dd HH:mm"));
//            dto.setTitle(v.getTitle());
//
//
//            return dto;
//        });
//    }
//
//    @Override
//    public FsResponse selectMyReceiveList(Integer pageNo, Integer pageSize, Long userId) {
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("userId", userId);
//        example.setOrderByClause(" status asc ");
//        PageHelper.startPage(pageNo, pageSize);
//        return DtoChangeUtils.getPageList(userMissionMapper.selectByExample(example), copy -> {
//
//            MissionReceiveListDto dto = new MissionReceiveListDto();
//
//            Mission mission = selectById(copy.getMissionId());
//            dto.setMissionId(copy.getMissionId());
//            dto.setMissionCode(copy.getMissionCode());
//            dto.setTitle(mission.getTitle());
//            dto.setMainPic(mission.getMainPic());
//            dto.setPrice(mission.getPrice());
//            dto.setMemo(copy.getMemo());
//            dto.setImgs(copy.getImgs());
//            dto.setStatus(copy.getStatus());
//            dto.setMissionCode(copy.getMissionCode());
//            dto.setStatusDesc(MissionCheckStatus.valOf(copy.getStatus()).getDesc());
//
//
//            dto.setTimeDesc(DateUtils.formatDate(copy.getCtime(), "yyyy-MM-dd HH:mm"));
//
//
//            return dto;
//        });
//    }
//
//    @Override
//    public Mission selectById(Long missionId) {
//        return missionMapper.selectByPrimaryKey(missionId);
//    }
//
//    @Override
//    public void cancle(Long missionId) {
//        Mission mission = new Mission();
//        mission.setId(missionId);
//        mission.setStatus(MissionStatus.terminate.getVal());
//        missionMapper.updateByPrimaryKeySelective(mission);
//    }
//
//    @Override
//    public UserMission selectByUserId(Long id, Long userId) {
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("userId", userId).andEqualTo("missionId", id);
//        return userMissionMapper.selectOneByExample(example);
//    }
//
//    @Override
//    public void generateMissCode(int length) {
//        //默认一次生成10w次code
//        String numStr = "0123456789";
//        String wordStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//        MissionCode ms = new MissionCode();
//        Random random = new Random();
//        for (int i = 0; i < 100; i++) {
//
//            String code = "";
//            for (int k = 0; k < length; k++) {
//                code += random.nextBoolean() ? numStr.charAt(random.nextInt(10)) : wordStr.charAt(random.nextInt(26));
//            }
//
//            try {
//                ms.setCode(code);
//                missionCodeMapper.insertSelective(ms);
//            } catch (Exception e) {
//
//            }
//        }
//
//    }
//
//    @Override
//    public String getMissionCode() {
//        Example example = new Example(MissionCode.class);
//        example.createCriteria().andEqualTo("status", 0);
//        example.setOrderByClause(" id limit 1");
//        MissionCode missionCode = missionCodeMapper.selectOneByExample(example);
//        if (Objects.nonNull(missionCode)) {
//            missionCode.setStatus(1);
//            missionCodeMapper.updateByPrimaryKeySelective(missionCode);
//        }
//        return Optional.ofNullable(missionCode).map(MissionCode::getCode).orElse(null);
//    }
//
//    @Override
//    public UserMission selectByMissionCode(String missionCode) {
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("missionCode", missionCode);
//        return userMissionMapper.selectOneByExample(example);
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public FsResponse receive(Long missionId, Long userId) {
//        //校验是否领取过
//        UserMission userMission = selectByUserId(missionId, userId);
//        if (Objects.nonNull(userMission)) {
//            return FsResponseGen.fail(YiChatMsgCode.MISSION_HAS_RECEIVED);
//        }
//
//        //任务是否终止
//        Mission mis = selectById(missionId);
//        if (mis.getStatus().compareTo(MissionStatus.terminate.getVal()) == 0) {
//            return FsResponseGen.fail(YiChatMsgCode.MISSION_HAS_STOP);
//        }
//
//        //领取任务 填充任务码头
//        String code = getMissionCode();
//        if (Objects.isNull(code)) {
//            return FsResponseGen.fail(YiChatMsgCode.MISSION_NONE_CODE);
//        }
//
//        Mission ms = selectById(missionId);
//
//        UserMission mission = new UserMission();
//        mission.setMissionCode(code);
//        mission.setUserId(userId);
//        mission.setMissionId(missionId);
//        mission.setMissionUserId(ms.getUserId());
//        mission.setMoney(mis.getPrice());
//        userMissionMapper.insertSelective(mission);
//
//        //更新可抢任务数量
//        missionMapper.minusHasNum(missionId);
//
//        return FsResponseGen.successData(detailMission(missionId, userId));
//    }
//
//    @Override
//    public MissionDetailDto detailMission(Long missionId, Long userId) {
//        return DtoChangeUtils.getDto(selectById(missionId), copy -> {
//            MissionDetailDto dto = new MissionDetailDto();
//            dto.setMissionId(copy.getId());
//            dto.setTitle(copy.getTitle());
//            dto.setMainPic(copy.getMainPic());
//            dto.setPrice(copy.getPrice());
//            dto.setTimeDesc(DateUtils.formatDate(copy.getPublishTime(), "yyyy-MM-dd HH:mm"));
//            dto.setMemo(copy.getMemo());
//            dto.setImgs(copy.getImgs());
//            dto.setCheckType(copy.getCheckType());
//            dto.setCompleteNum(copy.getCompleteNum());
//            dto.setNum(copy.getNum());
//            dto.setStatus(copy.getStatus());
//            dto.setStatusDesc(MissionStatus.valOf(copy.getStatus()).getDesc());
//            UserMission userMission = selectByUserId(copy.getId(), userId);
//            dto.setMissionCode(Optional.ofNullable(userMission).map(UserMission::getMissionCode).orElse(""));
//            if (Objects.nonNull(userMission)) {
//                dto.setReceiveStatus(userMission.getStatus());
//                dto.setReceiveStatusDesc(MissionCheckStatus.valOf(userMission.getStatus()).getDesc());
//                dto.setSubmitTimeDesc(DateUtils.formatDate(userMission.getSubmitTime(), "yyyy-MM-dd HH:mm:ss"));
//                dto.setReason(userMission.getRefuseReason());
//            }
//            dto.setHasReceiveStatus(StringUtils.isNotBlank(dto.getMissionCode()) ? 1 : 0);
//
//            return dto;
//        });
//    }
//
//    @Override
//    public FsResponse submit(Long missionId, String imgs, String memo, Long userId) {
//        UserMission mission = selectByUserId(missionId, userId);
//        //提交的任务必须不能是已完成状态或待审核状态
//        if (mission.getStatus().compareTo(MissionCheckStatus.submit.getVal()) == 0) {
//            return FsResponseGen.fail(YiChatMsgCode.MISSION_HAS_SUBMIT);
//        }
//
//        if (mission.getBalanceStatus() != 0) {
//            return FsResponseGen.fail(YiChatMsgCode.MISSION_HAS_COMPLETE);
//        }
//
//        if (mission.getStatus() == MissionCheckStatus.doing.getVal() || mission.getStatus() == MissionCheckStatus.check_no_pass.getVal()) {
//            mission.setMemo(memo);
//            mission.setImgs(imgs);
//            mission.setStatus(MissionCheckStatus.submit.getVal());
//            mission.setSubmitTime(new Date());
//            userMissionMapper.updateByPrimaryKeySelective(mission);
//            missionMapper.plusCheckNum(missionId);
//            return FsResponseGen.success();
//        } else {
//            return FsResponseGen.success(YiChatMsgCode.MISSION_NONE_AUTH);
//        }
//
//    }
//
//    @Override
//    public FsResponse selectCheckList(Integer pageNo, Integer pageSize, Integer type, Long missionId, Long userId) {
//        Example example = new Example(UserMission.class);
//        if (type == 1) {
//            example.createCriteria().andEqualTo("missionId", missionId).andEqualTo("missionUserId", userId).andEqualTo("status", type);
//        } else {
//            Integer[] ins = {MissionCheckStatus.check_pass.getVal(), MissionCheckStatus.check_no_pass.getVal(), MissionCheckStatus.overtime_pass.getVal()};
//            example.createCriteria().andEqualTo("missionId", missionId).andEqualTo("missionUserId", userId).andIn("status", Arrays.asList(ins));
//        }
//        example.setOrderByClause(" submit_time asc ");
//        PageHelper.startPage(pageNo, pageSize);
//
//        return DtoChangeUtils.getPageList(userMissionMapper.selectByExample(example), copy -> {
//
//            Mission mission = selectById(copy.getMissionId());
//            User user = userService.selectById(copy.getUserId());
//
//            MissionCheckListDto dto = new MissionCheckListDto();
//            dto.setUserMissionId(copy.getId());
//            dto.setNick(user.getNick());
//            dto.setUserId(copy.getUserId());
//            dto.setMainPic(mission.getMainPic());
//            dto.setTitle(mission.getTitle());
//            dto.setMissionCode(copy.getMissionCode());
//            dto.setSubmitImgs(copy.getImgs());
//            dto.setSubmitMemo(copy.getMemo());
//            dto.setSubmitTime(copy.getSubmitTime().getTime());
//            dto.setCountdownDesc(String.valueOf((System.currentTimeMillis() - copy.getSubmitTime().getTime()) / 60000L));
//            dto.setReceiveStatus(copy.getStatus());
//            dto.setReceiveStatusDesc(MissionCheckStatus.valOf(copy.getStatus()).getDesc());
//
//            return dto;
//        });
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public FsResponse check(Long userMissionId, Integer type, String reason, Long userId) {
//        UserMission userMission = userMissionMapper.selectByPrimaryKey(userMissionId);
//
//        //不是当前人能够审核
//        if (userMission.getMissionUserId().compareTo(userId) != 0) {
//            return FsResponseGen.success(YiChatMsgCode.MISSION_NONE_AUTH);
//        }
//
//        //必须是待审核状态
//        if (userMission.getStatus().compareTo(MissionCheckStatus.submit.getVal()) != 0) {
//            return FsResponseGen.success(YiChatMsgCode.MISSION_NOT_CHECK_STATUS);
//        }
//
//        userMission.setCheckTime(new Date());
//        //type=0  审核通过  任务完成数+1
//        if (type == 0) {
//            userMission.setStatus(MissionCheckStatus.check_pass.getVal());
//            userMission.setBalanceStatus(1);
//            missionMapper.minusCheckNum(userMission.getMissionId());
//            missionMapper.plusCompleteNum(userMission.getMissionId());
//            //获取金额入账
//            balanceService.update(userMission.getUserId(), BalanceType.MISSION_COMPLETE, userMission.getMoney(), userMissionId, "审核完成领取金额");
//        } else {//type=1  审核拒绝
//            userMission.setStatus(MissionCheckStatus.check_no_pass.getVal());
//            userMission.setRefuseReason(reason);
//
//        }
//
//        userMissionMapper.updateByPrimaryKeySelective(userMission);
//
//        return FsResponseGen.success();
//    }
//
//    @Override
//    public void timeoutBalance() {
//        //查询做任务已入账到冻结金额中的值
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("balanceStatus", 1)
//                .andLessThan("checkTime", DateUtils.formatDate(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L), "yyyy-MM-dd HH:mm:ss"));
//        List<UserMission> list = userMissionMapper.selectByExample(example);
//        for (UserMission um : list) {
//            balanceService.update(um.getUserId(), BalanceType.MISSION_COMPLETE_WITHDRAW, um.getMoney(), um.getId(), "完成任务冻结转可提现");
//            //状态变更
//            um.setBalanceStatus(2);
//            userMissionMapper.updateByPrimaryKeySelective(um);
//        }
//    }
//
//    @Override
//    public void timeoutSubmit() {
//        //超时未提交的
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("status", MissionCheckStatus.doing.getVal())
//                .andLessThan("ctime", DateUtils.formatDate(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L), "yyyy-MM-dd HH:mm:ss"));
//
//        List<UserMission> list = userMissionMapper.selectByExample(example);
//        for (UserMission um : list) {
//            um.setStatus(MissionCheckStatus.overtime_cancle.getVal());
//            userMissionMapper.updateByPrimaryKeySelective(um);
//            //机会返回
//            missionMapper.plusHasNum(um.getMissionId());
//        }
//    }
//
//    @Override
//    public void timeoutCheck() {
//        //超时未审核的
//        Example example = new Example(UserMission.class);
//        example.createCriteria().andEqualTo("status", MissionCheckStatus.submit.getVal())
//                .andLessThan("submitTime", DateUtils.formatDate(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L), "yyyy-MM-dd HH:mm:ss"));
//
//        List<UserMission> list = userMissionMapper.selectByExample(example);
//        for (UserMission um : list) {
//            um.setStatus(MissionCheckStatus.overtime_pass.getVal());
//            userMissionMapper.updateByPrimaryKeySelective(um);
//            //人工转自动审核
//            check(um.getMissionId(), 0, null, um.getMissionUserId());
//
//        }
//    }
//
//    @Override
//    public FsResponse checkNotify(String missionCode) {
//        //先查询任务码是否有效
//        UserMission userMission = selectByMissionCode(missionCode);
//        if (Objects.isNull(userMission)) {
//            return FsResponseGen.successData(YiChatMsgCode.MISSION_CODE_INVALID);
//        }
//
//        if (userMission.getStatus().compareTo(MissionCheckStatus.doing.getVal()) == 0) {
//            return FsResponseGen.successData(YiChatMsgCode.MISSION_NONE_AUTH);
//        }
//
//        userMission.setStatus(MissionCheckStatus.check_pass.getVal());
//        userMission.setBalanceStatus(1);
//        missionMapper.plusCompleteNum(userMission.getMissionId());
//        //获取金额入账
//        balanceService.update(userMission.getUserId(), BalanceType.MISSION_COMPLETE, userMission.getMoney(), userMission.getId(), "审核完成领取金额");
//
//        return null;
//    }
//
//    @Override
//    public FsResponse complain(Long missionId, Long userId) {
//        MissionComplain mc = new MissionComplain();
//        mc.setMissionId(missionId);
//        mc.setUserId(userId);
//        missionComplainMapper.insertSelective(mc);
//        return FsResponseGen.success();
//    }
}
